#!/usr/bin/env python
#-*- coding:utf-8 -*-

from __future__ import print_function

import sys
import timeit
import subprocess
import time

from tarea import Tarea

def ayuda ():
    return """
        Programa para la ejecucion de pruebas de paralelizacion para el analisis de la ley de Amhdal.

        Forma de uso:
            python prueba.py muestras repeticiones operacion h1 ... hN [-h]

        Donde:
            muestras: Cantidad de veces que utilizado en las llamadas a timeit.
            repeticiones: Cuantas veces se debe repetir la operación.
            operacion: Una de las clases definidas en "elegir_tarea.py". Puede ser: SUMAS, RAIZ, STRINGS.
            h1 ... hN: Secuencia de cantidad de hilos para ejecutar la tarea.                              
    """

def main_subprocess():
    mostrar_ayuda = True;
    if len(sys.argv) > 1:
        mostrar_ayuda = False;
        for arg in sys.argv[1:]:
        if (arg == "-h"):
            mostrar_ayuda = True;
    
    if mostrar_ayuda:
        print (ayuda());
        return 0;    

    muestras = int(sys.argv[1])
    repeticiones = int(sys.argv[2])
    operacion = sys.argv[3]
    cant_hilos = []
    for i in xrange(4, len(sys.argv)):
        cant_hilos.append(int(sys.argv[i]))

    print ("Muestras: ", muestras)
    print ("Repeticiones: ", repeticiones)
    print ("Hilos: ", cant_hilos)
    print ("Operacion: ", operacion)

    print (Tarea.encabezados())
    sys.stdout.flush()
    for n in cant_hilos:
        delta = repeticiones/n
        sobrante = repeticiones%n
        if sobrante != 0:
            print ("La cantidad de elementos no es multiplo de la cantidad de hilos. {0}, {1}, {2}".format(repeticiones,n,sobrante), file=sys.stderr)
        hilos = []
        fin = 0
        for h in xrange(1,n+1):
            inicio = fin
            fin = inicio+delta
            if h == n:
                fin += sobrante

            p = subprocess.Popen(["python", "elegir_tarea.py", str(n)+"."+str(h), operacion, str(inicio), str(fin), str(muestras)])#, stdout=sys.stdout)
            hilos.append( (n, h, p) )

        for n, h, p in hilos:
            p.wait()
        print ("{0}.{1}: Terminado.".format(n,"*"), file=sys.stderr)
        
if __name__ == '__main__':
    main_subprocess()

